package handler;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import bean.User;
import service.UserService;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Date;
import java.util.List;

/*
 * spring mvc的控制器的方法默认支持以下参数类型：
 * HttpServletRequest，HttpServletResponse，HttpSession，Model，ModelMap
 */
@Controller
public class ControllerHandler {
    private final UserService service;

    @Autowired
    public ControllerHandler(@Qualifier(value = "service") UserService service) {
        this.service = service;
    }

    /*
     * 当请求对象（HttpServletRequest实例）中的参数名称匹配控制器的方法（如该方法的名称addUser）
     * 的参数列表中的某个参数（如addUser方法的参数temp）所属类的成员属性（temp所属类的字段）时，
     * 将自动装配相应参数至该对象中
     * 如果请求对象中存在参数名中包含分隔符（英文句点）的参数（如“prefix.suffix”），
     * 且该参数名中的前一个子字符串（prefix）匹配temp所属类型的成员属性prefix，
     * 同时后一个子字符串（suffix）匹配该成员属性prefix的成员属性suffix，
     * 那么spring mvc将装配该参数（prefix.suffix）至temp对象的prefix属性的suffix属性中
     */
    @RequestMapping(value = "/user/add", method = RequestMethod.POST)
    public String addUser(User temp) throws IOException {
        service.add(temp);
        return "redirect:../users";
    }

    @RequestMapping(value = "/user/modify", method = RequestMethod.POST)
    // 将请求中的所有匹配temp对象的成员属性的参数自动装配至temp对象中
    public String modifyUser(User temp) throws IOException {
        service.modify(temp);
        return "redirect:../users";
    }

    /*
     * 当控制器的方法中的任何参数不匹配请求对象中的任意参数名时，spring mvc无法执行自动装配
     * @RequestParam用于将该注解的name或value属性的值代表的请求对象的参数名称赋值给控制器方法的相应参数
     */
    @RequestMapping(value = "/user/remove", method = RequestMethod.POST)
    public String removeUser(@RequestParam(name = "id") int tid) throws IOException {
        service.remove(tid);
        return "redirect:../users";
    }

    @RequestMapping("/users")
    public String queryUsers(User temp, HttpServletRequest req, Model model, HttpSession session) {
        List<User> users = req.getMethod().equals("POST") ? service.query(temp) : service.query(null);
        model.addAttribute("users", users);
        session.setAttribute("time", new Date());
        // 返回值为视图的名称
        return "index";
    }

    /*
     * @RequestMapping(value = "/user")
     * RequestMapping的请求映射可以包含参数，但参数必须被“{}”引用
     */
    @RequestMapping(value = "/user/{tid}")
    public String queryUser(
            // @RequestParam int id
            // PathVariable表示方法参数应该被绑定到URI模板变量的注解，name或value值必须等于RequestMapping中的参数值
            @PathVariable(name = "tid") int id, ModelMap modelMap) {
        User user = service.query(id);
        if (user != null) {
            System.out.println(user);
            modelMap.addAttribute("object", user);
            return "modify";
        }
        return null;
    }
}
